import axios from 'axios';
import { ElNotification, ElMessageBox, ElMessage } from 'element-plus';
// import Vue from 'vue';
// import store from '@/store';
import { getToken } from '@/utils/auth';

const errorCode: Record<string, string> = {
    401: '认证失败，无法访问系统资源',
    403: '当前操作没有权限',
    404: '访问资源不存在',
    default: '系统未知错误，请反馈给管理员'
};

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';
// axios.defaults.withCredentials = true; // 跨域访问需要发送cookie时一定要加这句
// 创建axios实例
const service = axios.create({
    // axios中请求配置有baseURL选项，表示请求URL公共部分
    baseURL: import.meta.env.VITE_APP_BASE_API,
    // 超时
    timeout: 10000
});
// request拦截器
service.interceptors.request.use(
    (config) => {
        // 是否需要设置 token
        const isToken = (config.headers || {}).isToken === false;
        if (getToken() && !isToken) {
            config.headers && (config.headers.Authorization = `Bearer ${getToken()}`); // 让每个请求携带自定义token 请根据实际情况自行修改
        }
        // get请求映射params参数
        if (config.method === 'get' && config.params) {
            let url = `${config.url}?`;
            Object.keys(config.params).forEach((propName) => {
                const value = config.params[propName];
                const part = `${encodeURIComponent(propName)}=`;
                if (value !== null && typeof value !== 'undefined') {
                    if (typeof value === 'object') {
                        Object.keys(value).forEach((key) => {
                            const params = `${propName}[${key}]`;
                            const subPart = `${encodeURIComponent(params)}=`;
                            url
                                += `${subPart + encodeURIComponent(value[key])}&`;
                        });
                    } else {
                        url += `${part + encodeURIComponent(value)}&`;
                    }
                }
            });
            url = url.slice(0, -1);
            config.params = {};
            config.url = url;
        }
        return config;
    },
    (error) => {
        console.log(error);
        Promise.reject(error);
    }
);

// 响应拦截器
service.interceptors.response.use(
    (res) => {
        // 未设置状态码则默认成功状态
        const code = res.data.code || 0;
        // 获取错误信息
        const msg = errorCode[code] || res.data.message || errorCode.default;
        if (code === 401) {
            ElMessageBox.confirm(
                '登录状态已过期，您可以继续留在该页面，或者重新登录',
                '系统提示',
                {
                    confirmButtonText: '重新登录',
                    cancelButtonText: '取消',
                    type: 'warning'
                }
            )
                .then(() => {
                    // Vue.$store.dispatch('logout').then(() => {
                    //     window.location.href = '/index.html';
                    // });
                })
                .catch(() => {});
            return Promise.reject(res);
        } if (code === 500) {
            ElMessage({
                message: msg,
                type: 'error'
            });
            return Promise.reject(new Error(msg));
        } if (![0, 200, 100010, 100030, 100020, 100040].includes(code)) {
            ElNotification.error({
                title: msg
            });
            return Promise.reject(res);
        }
        return res.data;
    },
    (error) => {
        let { message } = error;
        if (message === 'Network Error') {
            message = '后端接口连接异常';
        } else if (message.includes('timeout')) {
            message = '系统接口请求超时';
        } else if (message.includes('Request failed with status code')) {
            message = `系统接口${message.substr(message.length - 3)}异常`;
        }
        ElMessage({
            message,
            type: 'error',
            duration: 5 * 1000
        });
        return Promise.reject(error);
    }
);
export default service;
